import json
import re
import plotly.graph_objects as go

# 解析字符串函数
def parse_f64point_string(point_string):
    # 使用正则表达式匹配 F64Point 中的坐标
    pattern = r"F64Point\s*{\s*x:\s*([0-9.]+),\s*y:\s*([0-9.]+)\s*}"
    
    # 查找所有匹配的坐标
    matches = re.findall(pattern, point_string)
    
    # 将字符串中的坐标转换为浮点数，并构造包含字典的列表
    points = [{"x": float(x), "y": float(y)} for x, y in matches]
    
    return points

# 读取 JSON 文件
with open('test_walkable.json') as f:  # 将 'test_walkable.json' 替换为你的实际文件名
    data = json.load(f)

# 提取顶点坐标
points = data["points"]

# 提取 points 列表中的所有点的 x, y 坐标
x_coords = [point["x"] for point in points]
y_coords = [point["y"] for point in points]

# 创建图形
fig = go.Figure()

# 提取多边形并绘制
for polygon in data["polygons"]:
    point_indices = polygon["point_indices"]
    
    # 使用索引提取多边形的顶点坐标
    polygon_x = [x_coords[i] for i in point_indices]
    polygon_y = [y_coords[i] for i in point_indices]

    # 为了闭合多边形，将第一个点添加到最后
    polygon_x.append(polygon_x[0])
    polygon_y.append(polygon_y[0])

    center_x = sum(polygon_x[:-1]) / len(polygon_x[:-1])
    center_y = sum(polygon_y[:-1]) / len(polygon_y[:-1])
    polygon_index = polygon["polygon_index"]

    # 绘制多边形
    fig.add_trace(go.Scatter(
        x=polygon_x, 
        y=polygon_y, 
        fill='toself',  # 填充多边形
        mode='lines+markers',  # 显示线条和标记点
        name="Polygon",
        hovertemplate='X: %{x:.6f}<br>Y: %{y:.6f}<extra></extra>',  # 自定义显示完整的坐标，显示6位小数
    ))

    # 在多边形中心绘制 polygon_index
    fig.add_trace(go.Scatter(
        x=[center_x],
        y=[center_y],
        mode='text',  # 仅显示文本
        text=[f"Index: {polygon_index}"],  # 显示 polygon_index
        textposition="middle center",  # 文本居中
        name=f"Index {polygon_index}",
        hoverinfo="skip",  # 禁用 hover 信息
    ))

# 设置图形的标题和坐标轴标签
fig.update_layout(
    title="Polygons and Line Segment from JSON Data",
    xaxis_title="X Axis",
    yaxis_title="Y Axis",
    showlegend=True,
    xaxis=dict(tickformat=".6f"),  # 强制显示完整的X坐标
    yaxis=dict(tickformat=".6f")   # 强制显示完整的Y坐标
)

# 显示图表
fig.show()
